package com.xgk.boot.module.core.util;

import cn.hutool.core.util.StrUtil;
import com.xgk.boot.framework.security.core.LoginUser;
import com.xgk.boot.framework.security.core.util.SecurityFrameworkUtils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicInteger;

public class CommonUtil {
    // 紧凑时间格式器（线程安全）
    private static final DateTimeFormatter COMPACT_FORMATTER =
            DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");

    // 毫秒级计数器（解决同一毫秒内的并发问题）
    private static final AtomicInteger counter = new AtomicInteger(0);

    // 最大计数值（避免溢出）
    private static final int MAX_COUNTER = 999;

    /**
     * 生成唯一订单编码
     * 格式：客户编码 + 时间戳(yyyyMMddHHmmssSSS) + 计数器(3位)
     */
    public static String getNewOrderCode() {
        String customerCode = getCustomerCode();
        String timestamp = getCompactDateTime();
        int count = counter.updateAndGet(i -> i >= MAX_COUNTER ? 0 : i + 1);

        return String.format("%s%s%03d", customerCode, timestamp, count);
    }

    // 获取客户编码（线程安全）
    private static String getCustomerCode() {
        LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
        if (loginUser != null && StrUtil.isNotBlank(loginUser.getUsername())) {
            return loginUser.getUsername();
        }
        return "SYSTEM"; // 默认客户编码
    }

    // 获取紧凑格式时间戳（线程安全）
    private static String getCompactDateTime() {
        return LocalDateTime.now().format(COMPACT_FORMATTER);
    }

//    public static void main(String[] args) {
//        // 测试生成订单编码
//        for (int i = 0; i < 1000; i++) {
//            String orderCode = getOrderCode();
//            System.out.println("生成的订单编码: " + orderCode);
//        }
//    }
}
